package com.twotiger.and.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 
 * @Description: 
 * 精准计算
 * @Author douxy
 * @Date 2015年7月9日 下午1:34:36
 */
public class ArithUtils {

    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    //这个类不能实例化
    private ArithUtils() {

    }

    /**
     * 去掉多余的位<br/>
     * exp:<br/>
     * 0.0 ---->0<br/>
     * 0.0100 ---->0.01<br/>
     * 00.0----->0<br/>
     * @param val
     * @return
     */
    public static String trim(double val) {
        String tmp = val + "", r = "";
        int s = -1, e = -1, dotIdx = -1;
        for (int i = 0; i < tmp.length(); i++) {
            if (((tmp.charAt(i) > 48 && tmp.charAt(i) < 58) || tmp.charAt(i) == '-') && s == -1) {
                s = i;
            }
            if (tmp.charAt(i) == '.') {
                dotIdx = i;
            }
            if (dotIdx == -1 || (dotIdx != -1 && tmp.charAt(i) > 48 && tmp.charAt(i) < 58)) {
                e = i;
            }
        }
        if (s == -1 || e == -1) {
            r = tmp;
        } else {
            r = tmp.substring(s, e + 1);
        }
        LogUtil.info(ArithUtils.class, "trim :" + val + "--->" + r);
        return r;
    }

    public static String toStr(double val) {
        return val + "";
    }

    /**
     * 格式化金额，三位一逗号,两位小数
     * 
     * @param money
     * @return
     */
    public static String coverMoneyComma(String money) {

        if (StringUtils.isBlank(money)) {
            return "";
        }

        String result = "0.00";

        DecimalFormat myformat_comma = new DecimalFormat("###,##0.00"); //格式化
        result = myformat_comma.format(Double.parseDouble(money));
        return result;

    }

    /**
     * 格式化金额，三位一逗号,不保留小数
     * 
     * @param money
     * @return
     */
    public static String coverMoneyCommaNoSmall(String money) {

        if (StringUtils.isBlank(money)) {
            return "";
        }

        String result = "0";

        DecimalFormat myformat_comma = new DecimalFormat("###,##0"); //格式化
        result = myformat_comma.format(Double.parseDouble(money));
        return result;

    }

    /**
     * 格式化金额，两位小数
     * 
     * @param money
     * @return
     */
    public static String coverMoney(String money) {
        if (StringUtils.isBlank(money)) {
            return "";
        }
        String result = "0.00";
        try {
            DecimalFormat myformat_comma = new DecimalFormat("0.00"); //格式化
            result = myformat_comma.format(Double.parseDouble(money));
        } catch (Exception e) {

        }
        return result;

    }

    /**
     * 格式化金额，四位小数
     * 
     * @param money
     * @return
     */
    public static String coverMoneyFour(String money) {
        if (StringUtils.isBlank(money)) {
            return "";
        }
        String result = "0.0000";
        DecimalFormat myformat_comma = new DecimalFormat("0.0000"); //格式化
        result = myformat_comma.format(Double.parseDouble(money));
        return result;

    }

    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    public static double add(double v1, double v2, int scale) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 格式化金额，末位是0的省略
     * 
     * @param v1
     * @return
     */
    public static String formatProject(double v1, String format) {
        DecimalFormat decimalFormat = new DecimalFormat(format);
        String s = decimalFormat.format(new BigDecimal(v1 + ""));
        return s;
    }

    public static String add(String v1, String v2) {
        if (StringUtils.isEmpty(v1)) {
            if (StringUtils.isEmpty(v2)) {
                return "0.00";
            } else {
                return v2;
            }
        }
        if (StringUtils.isEmpty(v2)) {
            return v1;
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).toString();
    }

    public static BigDecimal add(String v1, String v2, int scale) {
        if (StringUtils.isEmpty(v1)) {
            if (StringUtils.isEmpty(v2)) {
                return new BigDecimal("0.00");
            } else {
                return new BigDecimal(v2);
            }
        }
        if (StringUtils.isEmpty(v2)) {
            return new BigDecimal(v1);
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 减
     * 
     * @param v1
     * @param v2
     * @return
     */
    public static double sub(double v1, double v2) {

        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    public static String sub(String v1, String v2) {
        if (StringUtils.isEmpty(v1)) {
            return "0.00";
        }
        if (StringUtils.isEmpty(v2)) {
            return v1;
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).toString();
    }

    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    public static String mul(String v1, String v2) {
        if (StringUtils.isEmpty(v1)) {
            if (StringUtils.isEmpty(v2)) {
                return "0.00";
            } else {
                return v2;
            }
        }
        if (StringUtils.isEmpty(v2)) {
            return v1;
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2).toString();
    }

    public static double div(double v1, double v2) {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static double div(String v1, String v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        if (StringUtils.isEmpty(v1)) {
            if (StringUtils.isEmpty(v2)) {
                return 0.00;
            } else {
                return new BigDecimal(v2).doubleValue();
            }
        }
        if (StringUtils.isEmpty(v2)) {
            return new BigDecimal(v1).doubleValue();
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static float convertsToFloat(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.floatValue();
    }

    public static int convertsToInt(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.intValue();
    }

    public static long convertsToLong(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.longValue();
    }

    public static double returnMax(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.max(b2).doubleValue();
    }

    public static double returnMin(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.min(b2).doubleValue();
    }

    public static int compareTo(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.compareTo(b2);
    }

    public static int compareTo(String v1, String v2) {
        if (StringUtils.isEmpty(v1)) {
            if (StringUtils.isEmpty(v2)) {
                return 0;
            } else {
                return -1;
            }
        }
        if (StringUtils.isEmpty(v2)) {
            return 1;
        }
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.compareTo(b2);
    }

    /**
     * double型数据过长java会显示科学计数法。此方法使其正常显示
     * 
     * @param value
     * @return
     */
    public static String formatFloatNumber(Double value) {
        if (value != null) {
            if (value.doubleValue() < 1) {
                return value.toString();
            } else if (value.doubleValue() != 0.00) {
                java.text.DecimalFormat df = new java.text.DecimalFormat("########.00");
                return df.format(value.doubleValue());
            }
        }
        return "";
    }

    /**
     * 判断字符串是否是有效金额
     * 
     * @param s
     * @return
     */
    public static boolean isValidAmount(String s) {
        if (StringUtils.isEmpty(s)) {
            return false;
        } else {
            if ("0".equals(s.charAt(0) + "")) {
                if (".".equals(s.charAt(1) + "")) {
                    return true;
                } else {
                    return true;
                }
            } else {
                return true;
            }
        }
    }
}
